# 是一个中文分词库，用于将中文文本按照一定的规则切分成一个个词语，方便后续对文本进行词频统计等处理，
# 在这里主要用于对从数据库中获取的旅游相关文本（景点介绍、评论内容等）进行分词操作，以便生成词云。
import jieba
#
from matplotlib import pylab as plt
# 引入 wordcloud 库中的 WordCloud 类，这个类提供了生成词云的核心功能，能够根据给定的文本内容以及相关配置参数（如背景颜色、词云形状等）
# 来生成可视化的词云图像。
from wordcloud import WordCloud
# 从 Python Imaging Library（PIL，常用于图像相关的操作）中导入 Image 类，用于打开作为词云形状蒙版的图片文件，
# 通过将图片转换为数组形式，为词云设置特定的形状提供基础数据。
from PIL import Image
import numpy as np
import json
import os
#
import django
# 这部分代码用于配置和启动 Django 环境，确保可以从 Django 项目的数据库中通过定义的 TravelInfo 模型类获取相关的旅游信息数据，
# 使得后续的词云生成操作能够基于真实的业务数据来进行。
os.environ.setdefault('DJANGO_SETTINGS_MODULE','travel.settings')
django.setup()
# 从 Django 项目中 app 应用下的 models.py 文件里导入 TravelInfo 模型类，这个类应该是对应数据库中存储旅游信息的表结构映射，
# 通过它可以查询、操作数据库里的旅游相关记录，比如获取所有的旅游景点记录，进而提取出景点介绍、评论等文本内容用于生成词云。
from app.models import TravelInfo

#
def getIntroCloudImg(targetImgSrc,resImgSrc):
    # 通过 TravelInfo 模型类的 objects.all() 方法从数据库中获取所有的旅游景点信息记录。
    travelList = TravelInfo.objects.all()
    text = ''
    stopwords = ['的', '是', '在', '这', '那', '他', '她', '它', '我', '你','和','等','为','有','与','了','就','都','也','可以','到','去','我们']
    # 接着通过循环遍历这些记录，将每个景点的详细介绍（detailIntro）字段内容拼接起来存储到 text 变量中，目的是将所有景点介绍文本整合在一起，
    # 作为后续生成词云的原始文本数据。
    for travel in travelList:
         text += travel.detailIntro
    # 文本预处理（分词与停用词去除）：
    # cut = jieba.cut(text)：使用 jieba 分词库对拼接好的文本 text 进行分词操作，将其切分成一个个词语，得到一个可迭代的分词结果对象 cut。
    cut = jieba.cut(text)
    newCut = []
    # 然后遍历 cut 中的每个词语，
    for tex in cut:
        # 通过与定义的停用词列表（包含一些常见的、在词云展示中可能不太有意义的词语，如 “的”“是” 等）进行对比，去除属于停用词的词语，
        if tex not in stopwords:
            # 将剩余的词语添加到 newCut 列表中，实现对文本的初步筛选和提纯，以便生成更有价值、更聚焦核心内容的词云。
            newCut.append(tex)
    # 将经过停用词去除后的词语列表 newCut 通过空格连接成一个字符串，使其符合 WordCloud 类生成词云时对输入文本的格式要求，
    # 即一个以空格分隔词语的文本字符串。
    string = ' '.join(newCut)
    # 使用 PIL 库的 Image 类打开指定路径（targetImgSrc）的图片文件，这个图片将作为词云的形状蒙版，即词云最终呈现的形状会与该图片的轮廓一致。
    img = Image.open(targetImgSrc)
    # 借助 numpy 库将打开的图片对象转换为数组形式，以便传递给 WordCloud 类的 mask 参数来定义词云形状。
    img_arr = np.array(img)
    # 实例化 WordCloud 类时，设置了 background_color='white'（指定词云的背景颜色为白色）、mask=img_arr（传入图片数组作为词云形状蒙版）
    # 以及指定了字体路径（font_path = 'STHUPO.TTF'，用于确保词云中文字能够正确显示，
    # 原先是 arial.ttf 可能存在中文字体显示问题所以进行了更改）等参数，
    wc = WordCloud(
        background_color='white',
        mask=img_arr,
        # font_path='arial.ttf'
        font_path = 'STHUPO.TTF'   # 原始
    )
    # 然后调用 wc.generate_from_text(string) 方法，根据前面处理好的文本字符串 string 来生成词云对象 wc。
    wc.generate_from_text(string)

    # 绘制图片
    fig = plt.figure(1)
    plt.imshow(wc)
    plt.axis('off') # 不显示坐标轴

    # plt.show()

    plt.savefig(resImgSrc,dpi=500)

# 功能：
# 这个函数整体功能和 getIntroCloudImg 函数非常相似，不过它是基于旅游景点的评论内容来生成词云图片，
def getCommentContentCloudImg(targetImgSrc,resImgSrc):
    # 数据获取与文本拼接：
    # 同样先通过 TravelInfo.objects.all() 获取所有旅游景点信息记录，
    travelList = TravelInfo.objects.all()
    text = ''
    stopwords = ['的', '是', '在', '这', '那', '他', '她', '它', '我', '你','和','等','为','有','与','了','就','都','也','可以','到','去','我们']
    # 然后遍历这些记录。
    for travel in travelList:
        # 对于每条记录，从其 comments 字段（该字段存储的是以 JSON 字符串形式表示的评论信息）中，
        # 使用 json.loads 方法将其解析为 Python 的字典列表形式，
        comments = json.loads(travel.comments)
        # 再进一步遍历每个评论字典，将其中的 content（评论内容）字段的值拼接起来存储到 text 变量中，
        # 这样就获取并整合了所有景点评论的文本内容，作为生成词云的原始文本数据来源。
        for comm in comments:
            text += comm['content']
    #
    cut = jieba.cut(text)
    newCut = []
    for tex in cut:
        if tex not in stopwords:
            newCut.append(tex)

    string = ' '.join(newCut)

    img = Image.open(targetImgSrc)
    img_arr = np.array(img)
    wc = WordCloud(
        background_color='white',
        mask=img_arr,
        # font_path='arial.ttf'
        font_path = 'STHUPO.TTF'
    )

    wc.generate_from_text(string)

    # 绘制图片
    fig = plt.figure(1)
    plt.imshow(wc)
    plt.axis('off') # 不显示坐标轴

    # plt.show()

    plt.savefig(resImgSrc,dpi=500)

if __name__ == '__main__':
    getCommentContentCloudImg('./static/2.jpg','./static/commentContentCloud.jpg')









